package br.com.sgp.util.handling;

import org.apache.log4j.Logger;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;

import br.com.sebrae.pr.sgp.util.exceptions.ExcecaoDeApresentacao;
import br.com.sebrae.pr.sgp.util.exceptions.TipoErro;
import br.com.sebrae.pr.sgp.util.exceptions.TratadorDeExcecoes;
import br.com.ufpr.util.base.BasePage;

public abstract class ErrorHandlingAjaxButton extends IndicatingAjaxButton {
    private static final long serialVersionUID = 4633849237970037279L;

    private static final Logger log = Logger.getLogger(ErrorHandlingAjaxButton.class);

    public ErrorHandlingAjaxButton(final String id) {
        super(id);
    }

    public ErrorHandlingAjaxButton(final String id, final IModel<String> model) {
        super(id, model);
    }

    @Override
    protected final void onSubmit(AjaxRequestTarget target, Form<?> form) {

        try {
            log.debug("Iniciando submit ajax.");
            ErrorHandlingAjaxButton.this.onSubmitted(target);
            log.debug("Acionando método de sucesso...");
            ErrorHandlingAjaxButton.this.onSucess(target);
            log.debug("Término da exucução do submit ajax.");

        } catch (Exception e) {
            TratadorDeExcecoes.logaException("Erro no submit ajax...", e);

            ErrorHandlingAjaxButton.this.onError(target);

            final ExcecaoDeApresentacao ea = TratadorDeExcecoes.convertException(e);
            ((BasePage) ErrorHandlingAjaxButton.this.getPage()).adicionaMensagem(ea.getTipoErro() != null ? ea.getTipoErro()
                    : TipoErro.ERRO, ea.getMensagem());
            ((BasePage) ErrorHandlingAjaxButton.this.getPage()).atualizarFeedbackPanel();
        }
    }

    protected abstract void onSubmitted(final AjaxRequestTarget target);

    protected void onSucess(final AjaxRequestTarget target) {

    }

    protected void onError(final AjaxRequestTarget target) {

    }

}
